﻿#ifndef SEMIAUTOMEASURE_H
#define SEMIAUTOMEASURE_H

#include "MeasureView/MeasureDataSet.h"
#include "MeasureView/MeasureCircleCenterSA.h"
#include "MeasureView/MeasureCircle2PSA.h"
#include "MeasureView/MeasureLineWidthSA.h"
#include "MeasureView/MeasureView_global.h"
#include "opencv2/core.hpp"
namespace Qly {


/**
 * @brief The SemiAutoMeasure class 半自动测量的算法类。这里收集了各种半自动测量算法。
 * 需要在 MainWindow 里面调用这个类来做半自动测量。
 * MEasureDataSet 类会发出 elementUpdated(MeasureElement *element) 这个信号。在 MainWindow 里面接收这个信号。
 * 在接收 elementUpdated 的 Slot 中做半自动测量。
 *
 * TODO: 1. 后面要增加亚像素精度的轮廓提取。
 *       2. 线宽测量还须要进一步完善。
 *       3. 现在传入的图像是灰度图像，也许后面应改回彩色图像。利用彩色图像可能能获取更多边缘信息。
 *       4. 圆测量对噪声的还比较敏感，后面应该增加去除噪点的算法。
 *       5. 增加一些参数设置，比如边缘是从黑到白还是从白到黑。利用这些先验知识增加测量的准确度。
 */
class MEASUREVIEW_EXPORT SemiAutoMeasure
{
public:
    SemiAutoMeasure(MeasureDataSet* dataSet);
    void semiAutoMeasure(MeasureElement *element, cv::Mat &grayMat);
private:
    bool semiAutoOuterCircle(MeasureCircleCenterSA * element, cv::Mat &edgeMat);
    bool semiAutoInnerCircle(MeasureCircle2PSA *element, cv::Mat &edgeMat);
    bool semiAutoLineWidth(MeasureLineWidthSA *element, cv::Mat & edgeMat);

    MeasureDataSet* pDataSet = nullptr;
};

}


#endif // SEMIAUTOMEASURE_H
